package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**Collection集合下 子集合【叫队列】
 * Queue   队列      单端队列
 * Deque   队列      双端队列    ”Deque接口--继承--Queue接口“
 * 作用：保存数据，有序储存和处理，功能：数据缓冲或者多线程协调工作！
 */
public class QueueAPI {
    //Queue  队列    单端队列
    @Test
    public void testQueue() {
        //创建队列--多态--LinkedList
        Queue<String> queue = new LinkedList<>();
        /**
         * offer()    ---add()一样
         * 作用：入队操作，对尾追加元素
         */
        queue.offer("青花瓷");
        queue.offer("冬眠");
        queue.offer("我的滑板鞋");
        queue.offer("体面");
        System.out.println("Queue队列：" + queue);
        /**
         * poll()   返回值：E
         * 作用：出风操作，获取队首元素，并且删除队列中队首
         * peek()   返回值：E
         * 作用：出队操作，获取队首元素，不删除队列中队首
         */
        queue.poll();
        queue.poll();//删除队首元素
        System.out.println("Queue队列：" + queue);
        String str = queue.peek();
        System.out.println("队首元素：" + str);
        System.out.println("Queue队列" + queue);
        /**
         * 需求：1.遍历队列---while---只遍历一次队列【队列元素消失】
         *   提示：while  条件：拿到队列中总长度 size()>0
         * 需求：2.遍历队列--增强for--队列元素不消失
         *   提示：for  条件：E e：队列
         */
        while (queue.size() > 0) {//true：队列总数>0  队列有元素  遍历
            str = queue.poll();//获取队首、删除队列中队首
            System.out.println("获取队列元素：" + str);
        }
        System.out.println("Queue队列元素：" + queue);
        /**
         * 需求：2.遍历队列--增强for--队列元素不消失
         * 提示：for  条件：E e：队列 数组泛型/集合泛型；数组引用/集合引用
         */
        for (String e : queue) {
            System.out.println("队列元素：" + e);
        }
        System.out.println("Queue队列" + queue);
    }

    //Deque  队列    双端队列---继承---单端队列
    @Test
    public void testDeque() {
        //创建Deque  双端队列  方法基本一致，部分方法不一致
        Deque<String> deque = new LinkedList<>();
        deque.offer("任耀希");
        deque.offer("李荣浩");
        deque.offer("陈奕迅");
        deque.offer("单依纯");
        System.out.println("双端队列：" + deque);
        //offerFirst   队首添加元素   OfferLast()  队尾添加元素
        deque.offerFirst("林俊杰");
        deque.offerFirst("张韶涵");
        System.out.println("双端队列【首尾添加元素】：" + deque);
        //getFirst()  获取队首  getLast()  获取队尾
        System.out.println("获取队列中队首：" + deque.getFirst());
        System.out.println("获取队列中队尾：" + deque.getLast());
        //pollFirst()  获取队首，删除队列中队首   【单端：poll类似】
        //pollLast()  获取队尾，删除队列中队尾
    }

    /**
     * 栈结构：业务中如果有后退【撤销情况使用】
     * 双端队列支持栈结构---提供相应的方法实现栈结构
     */
    @Test
    public void testStack() {
        //创建双端队列--支持栈结构
        Deque<String> stack = new LinkedList<>();
        /**
         * push() Deque  独有的方法---支持栈结构
         * ---offer：Queue---add：Collection接口【添加】
         * 作用：【添加：往栈压入一个元素】  压栈操作
         */
        stack.push("夯大力");
        stack.push("喜羊羊");
        stack.push("神奇阿呦");
        stack.push("甜心格格");
        System.out.println("栈结构：" + stack);
        /**
         * pop()  出栈一个尾元素 ---pollLast类似【拿先入后出，最后一个压栈元素】
         */
        String last = stack.pop();
        System.out.println("出栈尾元素：" + last);
        System.out.println("栈结构：" + stack);
        //面试题：pop、poll、peek的使用区别？
        /**
         * 需求1：遍历栈结构---while---元素出栈，队列需要清空
         * 需求2：遍历栈结构--增强for--元素遍历成功
         */
        while (stack.size() > 0) {
            last = stack.poll();
            System.out.println("获取栈：" + last);
        }
        System.out.println("stack元素"+stack);
        for (String e:stack){
            System.out.println("栈元素"+e);
        }
        System.out.println("Stack队列"+stack);
    }
    //pop poll peek区别？
    //poll：出队操作，获取队首元素，并且删除队列中队首
    //poll：出队操作，获取队首元素，不删除队列中元素
    //pop：出栈一个尾元素并删除
}
